//! `std::backtrace` 模块的测试用例
//!
//! 本文件包含用于测试 `std::backtrace` 相关功能的代码。
//! 注意：回溯信息的捕获和显示依赖于环境变量 `RUST_BACKTRACE`。

#[cfg(test)]
mod tests {
    use std::backtrace::{Backtrace, BacktraceStatus};

    /// 一个会产生错误的函数，用于捕获回溯信息
    fn trigger_error_and_capture_backtrace() -> Backtrace {
        // `Backtrace::capture()` 会在当前点捕获一个回溯
        // 注意：为了能捕获到有意义的回溯，需要设置 RUST_BACKTRACE=1
        Backtrace::capture()
    }

    /// 测试回溯的捕获状态
    #[test]
    fn test_backtrace_status() {
        // 在测试前设置环境变量，以确保能捕获回溯
        unsafe {
            std::env::set_var("RUST_BACKTRACE", "1");
        }

        let backtrace = trigger_error_and_capture_backtrace();

        // `status()` 方法返回回溯的捕获状态
        let status = backtrace.status();
        println!("回溯捕获状态: {:?}", status);

        // 检查状态是否为 `Captured`
        // 如果 `RUST_BACKTRACE` 未设置或为 `0`，状态可能是 `Disabled`
        // 在某些���台上可能不受支持
        match status {
            BacktraceStatus::Captured => {
                println!("成功捕获到回溯信息。");
                // 打印回溯信息
                println!("-------------------- Backtrace --------------------");
                println!("{:?}", backtrace);
                println!("-------------------------------------------------");
            }
            BacktraceStatus::Disabled => {
                println!("回溯功能被禁用。请设置环境变量 RUST_BACKTRACE=1。");
            }
            _ => {
                println!("回溯功能不受支持或存在其他问题。");
            }
        }

        // 断言状态不是 `Unsupported`
        assert_ne!(status, BacktraceStatus::Unsupported);
    }

    /// 演示如何将回溯信息格式化为字符串
    #[test]
    fn test_format_backtrace_to_string() {
        unsafe {
            std::env::set_var("RUST_BACKTRACE", "1");
        }
        let backtrace = trigger_error_and_capture_backtrace();

        if backtrace.status() == BacktraceStatus::Captured {
            let backtrace_str = backtrace.to_string();
            println!("格式化后的回溯信息:\n{}", backtrace_str);

            // 检查字符串中是否包含本测试函数的名称
            assert!(backtrace_str.contains("test_format_backtrace_to_string"));
        } else {
            println!("无法捕获回溯，跳过此测试。");
        }
    }
}
